'use strict';

const fs = require('fs');
const isWsl = require('is-wsl');
const path = require('path');
const webpack = require('webpack');
const resolve = require('resolve');
const PnpWebpackPlugin = require('pnp-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');
const InlineChunkHtmlPlugin = require('react-dev-utils/InlineChunkHtmlPlugin');
const TerserPlugin = require('terser-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const safePostCssParser = require('postcss-safe-parser');
const ManifestPlugin = require('webpack-manifest-plugin');
const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');
const WorkboxWebpackPlugin = require('workbox-webpack-plugin');
const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin');
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent');
const paths = require('./paths');
const modules = require('./modules');
const getClientEnvironment = require('./env');
const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin');
const ForkTsCheckerWebpackPlugin = require('react-dev-utils/ForkTsCheckerWebpackPlugin');
const typescriptFormatter = require('react-dev-utils/typescriptFormatter');
const OpenBrowserPlugin = require('open-browser-webpack-plugin')

const postcssNormalize = require('postcss-normalize');

// Source maps are resource heavy and can cause out of memory issue for large source files.
const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false';
// Some apps do not need the benefits of saving a web request, so not inlining the chunk
// makes for a smoother build process.
const shouldInlineRuntimeChunk = process.env.INLINE_RUNTIME_CHUNK !== 'false';

// Check if TypeScript is setup
const useTypeScript = fs.existsSync(paths.appTsConfig);

// style files regexes
const cssRegex = /\.css$/;
const cssModuleRegex = /\.module\.css$/;
const sassRegex = /\.(scss|sass)$/;
const sassModuleRegex = /\.module\.(scss|sass)$/;

const lessRegex = /\.(less)$/;
const lessModuleRegex = /\.module\.(less)$/;


// This is the production and development configuration.
// It is focused on developer experience, fast rebuilds, and a minimal bundle.
module.exports = function (webpackEnv) {
    const isEnvDevelopment = webpackEnv === 'development';
    const isEnvProduction = webpackEnv === 'production';

    // Webpack uses `publicPath` to determine where the app is being served from.
    // It requires a trailing slash, or the file assets will get an incorrect path.
    // In development, we always serve from the root. This makes config easier.
    const publicPath = isEnvProduction
        ? paths.servedPath
        : isEnvDevelopment && '/';
    // Some apps do not use client-side routing with pushState.
    // For these, "homepage" can be set to "." to enable relative asset paths.
    const shouldUseRelativeAssetPaths = publicPath === './';

    // `publicUrl` is just like `publicPath`, but we will provide it to our app
    // as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.
    // Omit trailing slash as %PUBLIC_URL%/xyz looks better than %PUBLIC_URL%xyz.
    const publicUrl = isEnvProduction
        ? publicPath.slice(0, -1)
        : isEnvDevelopment && '';
    // Get environment variables to inject into our app.
    const env = getClientEnvironment(publicUrl);

    // common function to get style loaders
    const getStyleLoaders = (cssOptions, preProcessor) => {
        const loaders = [
            isEnvDevelopment && require.resolve('style-loader'),
            isEnvProduction && {
                loader: MiniCssExtractPlugin.loader,
                options: shouldUseRelativeAssetPaths ? { publicPath: '../../' } : {},
            },
            {
                loader: require.resolve('css-loader'),
                options: cssOptions,
            },
            {
                // Options for PostCSS as we reference these options twice
                // Adds vendor prefixing based on your specified browser support in
                // package.json
                loader: require.resolve('postcss-loader'),
                options: {
                    // Necessary for external CSS imports to work
                    // https://github.com/facebook/create-react-app/issues/2677
                    ident: 'postcss',
                    plugins: () => [
                        require('postcss-flexbugs-fixes'),
                        require('postcss-preset-env')({
                            autoprefixer: {
                                flexbox: 'no-2009',
                            },
                            stage: 3,
                        }),
                        // Adds PostCSS Normalize as the reset css with default options,
                        // so that it honors browserslist config in package.json
                        // which in turn let's users customize the target behavior as per their needs.
                        postcssNormalize(),
                    ],
                    sourceMap: isEnvProduction && shouldUseSourceMap,
                },
            },
        ].filter(Boolean);
        if (preProcessor) {
            // loaders.push({
            //   loader: require.resolve(preProcessor),
            //   options: {
            //     sourceMap: isEnvProduction ? shouldUseSourceMap : isEnvDevelopment
            //   }
            // });

            //todo kim-stamp 全局修改主题
            let loader = require.resolve(preProcessor);
            if (preProcessor === 'less-loader') {
                loader = {
                    loader,
                    options: {
                        modifyVars: {
                            // 'link-color': '#1DA57A',
                            // 'border-radius-base': '2px',
                            // 'hack': `true; @import "your-less-file-path.less";`, // Override with less file
                            'primary-color': '#1890ff', // 全局主色
                            'link-color': '#1890ff', // 链接色
                            'success-color': ' #52c41a', // 成功色
                            'warning-color': ' #faad14', // 警告色
                            'error-color': ' #f5222d', // 错误色
                            'font-size-base': '14px', // 主字号
                            'heading-color': ' rgba(0, 0, 0, 0.85)', // 标题色
                            'text-color': ' rgba(0, 0, 0, 0.65)', // 主文本色
                            'text-color-secondary': 'rgba(0, 0, 0, .45)', // 次文本色
                            'disabled-color': ' rgba(0, 0, 0, .25)', // 失效色
                            'border-radius-base': '4px', // 组件/浮层圆角
                            'border-color-base': '#d9d9d9', // 边框色
                            'box-shadow-base': '0 2px 8px rgba(0, 0, 0, 0.15)', // 浮层阴影
                        },
                        javascriptEnabled: true
                    }
                };
            }
            loaders.push(loader);
        }
        return loaders;
    };

    return {
        mode: isEnvProduction ? 'production' : isEnvDevelopment && 'development',
        // Stop compilation early in production
        bail: isEnvProduction,

        //打包出来的不需要测试工具 .map映射文件
        // devtool: isEnvProduction ? shouldUseSourceMap ? 'source-map' : false : isEnvDevelopment && 'cheap-module-source-map',

        entry: [
            // Include an alternative client for WebpackDevServer. A client's job is to
            // connect to WebpackDevServer by a socket and get notified about changes.
            // When you save a file, the client will either apply hot updates (in case
            // of CSS changes), or refresh the page (in case of JS changes). When you
            // make a syntax error, this client will display a syntax error overlay.
            // Note: instead of the default WebpackDevServer client, we use a custom one
            // to bring better experience for Create React App users. You can replace
            // the line below with these two lines if you prefer the stock client:
            // require.resolve('webpack-dev-server/client') + '?/',
            // require.resolve('webpack/hot/dev-server'),
            isEnvDevelopment &&
            require.resolve('react-dev-utils/webpackHotDevClient'),
            // Finally, this is your app's code:
            paths.appIndexJs,
            // We include the app code last so that if there is a runtime error during
            // initialization, it doesn't blow up the WebpackDevServer client, and
            // changing JS code would still trigger a refresh.
        ].filter(Boolean),
        output: {
            // The build folder.
            path: isEnvProduction ? paths.appBuild : undefined,
            // Add /* filename */ comments to generated require()s in the output.
            pathinfo: isEnvDevelopment,
            // There will be one main bundle, and one file per asynchronous chunk.
            // In development, it does not produce real files.
            filename: isEnvProduction
                ? 'static/js/[name].[contenthash:8].js'
                : isEnvDevelopment && 'static/js/bundle.js',
            // TODO: remove this when upgrading to webpack 5
            futureEmitAssets: true,
            // There are also additional JS chunk files if you use code splitting.
            chunkFilename: isEnvProduction
                ? 'static/js/[name].[contenthash:8].chunk.js'
                : isEnvDevelopment && 'static/js/[name].chunk.js',
            // We inferred the "public path" (such as / or /my-project) from homepage.
            // We use "/" in development.
            publicPath: publicPath,
            // Point sourcemap entries to original disk location (format as URL on Windows)
            devtoolModuleFilenameTemplate: isEnvProduction
                ? info =>
                    path
                        .relative(paths.appSrc, info.absoluteResourcePath)
                        .replace(/\\/g, '/')
                : isEnvDevelopment &&
                (info => path.resolve(info.absoluteResourcePath).replace(/\\/g, '/')),
        },
        optimization: {
            minimize: isEnvProduction,
            minimizer: [
                // This is only used in production mode
                new TerserPlugin({
                    terserOptions: {
                        parse: {
                            // we want terser to parse ecma 8 code. However, we don't want it
                            // to apply any minfication steps that turns valid ecma 5 code
                            // into invalid ecma 5 code. This is why the 'compress' and 'output'
                            // sections only apply transformations that are ecma 5 safe
                            // https://github.com/facebook/create-react-app/pull/4234
                            ecma: 8,
                        },
                        compress: {
                            ecma: 5,
                            warnings: false,
                            // Disabled because of an issue with Uglify breaking seemingly valid code:
                            // https://github.com/facebook/create-react-app/issues/2376
                            // Pending further investigation:
                            // https://github.com/mishoo/UglifyJS2/issues/2011
                            comparisons: false,
                            // Disabled because of an issue with Terser breaking valid code:
                            // https://github.com/facebook/create-react-app/issues/5250
                            // Pending futher investigation:
                            // https://github.com/terser-js/terser/issues/120
                            inline: 2,
                        },
                        mangle: {
                            safari10: true,
                        },
                        output: {
                            ecma: 5,
                            comments: false,
                            // Turned on because emoji and regex is not minified properly using default
                            // https://github.com/facebook/create-react-app/issues/2488
                            ascii_only: true,
                        },
                    },
                    // Use multi-process parallel running to improve the build speed
                    // Default number of concurrent runs: os.cpus().length - 1
                    // Disabled on WSL (Windows Subsystem for Linux) due to an issue with Terser
                    // https://github.com/webpack-contrib/terser-webpack-plugin/issues/21
                    parallel: !isWsl,
                    cache: true,  //启用文件缓存
                    sourceMap: shouldUseSourceMap,
                }),
                // This is only used in production mode
                new OptimizeCSSAssetsPlugin({
                    cssProcessorOptions: {
                        parser: safePostCssParser,
                        map: shouldUseSourceMap
                            ? {
                                // `inline: false` forces the sourcemap to be output into a
                                // separate file
                                inline: false,
                                // `annotation: true` appends the sourceMappingURL to the end of
                                // the css file, helping the browser find the sourcemap
                                annotation: true,
                            }
                            : false,
                    },
                }),
            ],
            // Automatically split vendor and commons
            // https://twitter.com/wSokra/status/969633336732905474
            // https://medium.com/webpack/webpack-4-code-splitting-chunk-graph-and-the-splitchunks-optimization-be739a861366
            splitChunks: {
                chunks: 'all',
                name: false,
            },
            // Keep the runtime chunk separated to enable long term caching
            // https://twitter.com/wSokra/status/969679223278505985
            runtimeChunk: true,
        },
        resolve: {
            // This allows you to set a fallback for where Webpack should look for modules.
            // We placed these paths second because we want `node_modules` to "win"
            // if there are any conflicts. This matches Node resolution mechanism.
            // https://github.com/facebook/create-react-app/issues/253
            modules: ['node_modules', paths.appNodeModules].concat(
                modules.additionalModulePaths || []
            ),

            // https://github.com/facebook/create-react-app/issues/290
            extensions: paths.moduleFileExtensions
                .map(ext => `.${ext}`)
                .filter(ext => useTypeScript || !ext.includes('ts')),
            alias: {
                //支持React Native Web
                // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
                'react-native': 'react-native-web',
                '@': path.resolve(__dirname, '../src')
            },
            plugins: [
                // Adds support for installing with Plug'n'Play, leading to faster installs and adding
                // guards against forgotten dependencies and such.
                PnpWebpackPlugin,
                //防止用户从src/（或节点_modules/）之外导入文件。
                //这通常会导致混淆，因为我们只处理带有babel的src/中的文件。
                //为了解决这个问题，我们阻止您从src/导入文件--如果您愿意，
                //请将文件链接到您的节点_modules/中，让模块解析开始。
                //确保源文件已编译，因为不会以任何方式处理它们。
                new OpenBrowserPlugin({ url: `http://localhost:${process.env.PORT || 8080}` }),
                new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]),
            ],
        },
        resolveLoader: {
            plugins: [
                //也与即插即用有关，但这次它告诉Webpack加载它的加载程序 来自当前包
                PnpWebpackPlugin.moduleLoader(module),
            ],
        },
        module: {
            strictExportPresence: true,
            rules: [
                //禁用require.ensure，因为它不是标准语言功能。
                { parser: { requireEnsure: false } },

                //首先，运行linter 在babel处理JS之前执行此操作很重要。
                {
                    test: /\.(js|mjs|jsx|ts|tsx)$/,
                    enforce: 'pre',
                    use: [
                        {
                            options: {
                                formatter: require.resolve('react-dev-utils/eslintFormatter'),
                                eslintPath: require.resolve('eslint'),

                            },
                            loader: require.resolve('eslint-loader'),
                        },
                    ],
                    include: paths.appSrc,
                },
                {
                    // "oneOf" will traverse all following loaders until one will
                    // match the requirements. When no loader matches it will fall
                    // back to the "file" loader at the end of the loader list.
                    oneOf: [
                        // "url" loader works like "file" loader except that it embeds assets
                        // smaller than specified limit in bytes as data URLs to avoid requests.
                        // A missing `test` is equivalent to a match.
                        {
                            test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
                            loader: require.resolve('url-loader'),
                            options: {
                                limit: 10000,
                                name: 'static/media/[name].[hash:8].[ext]',
                            },
                        },
                        // Process application JS with Babel.
                        // The preset includes JSX, Flow, TypeScript, and some ESnext features.
                        {
                            test: /\.(js|mjs|jsx|ts|tsx)$/,
                            include: paths.appSrc,
                            loader: require.resolve('babel-loader'),
                            options: {
                                customize: require.resolve(
                                    'babel-preset-react-app/webpack-overrides'
                                ),
                                //todo kim-stamp 按需导入,按需加载  style: true会加载less文件
                                plugins: [
                                    ['import', { libraryName: 'antd', libraryDirectory: 'es', style: true }],
                                    [
                                        require.resolve('babel-plugin-named-asset-import'),
                                        {
                                            loaderMap: {
                                                svg: {
                                                    ReactComponent: '@svgr/webpack?-svgo,+ref![path]',
                                                },
                                            },
                                        },
                                    ],
                                ],
                                cacheDirectory: true,
                                cacheCompression: isEnvProduction,
                                compact: isEnvProduction,
                            },
                        },


                        // Process any JS outside of the app with Babel.
                        // Unlike the application JS, we only compile the standard ES features.
                        {
                            test: /\.(js|mjs)$/,
                            exclude: /@babel(?:\/|\\{1,2})runtime/,
                            loader: require.resolve('babel-loader'),
                            options: {
                                babelrc: false,
                                configFile: false,
                                compact: false,
                                presets: [
                                    [
                                        require.resolve('babel-preset-react-app/dependencies'),
                                        { helpers: true },
                                    ],
                                ],
                                cacheDirectory: true,
                                cacheCompression: isEnvProduction,

                                // If an error happens in a package, it's possible to be
                                // because it was compiled. Thus, we don't want the browser
                                // debugger to show the original code. Instead, the code
                                // being evaluated would be much more helpful.
                                sourceMaps: false,
                            },
                        },
                        // "postcss" loader applies autoprefixer to our CSS.
                        // "css" loader resolves paths in CSS and adds assets as dependencies.
                        // "style" loader turns CSS into JS modules that inject <style> tags.
                        // In production, we use MiniCSSExtractPlugin to extract that CSS
                        // to a file, but in development "style" loader enables hot editing


                        {
                            test: cssRegex,
                            exclude: cssModuleRegex,
                            use: getStyleLoaders({
                                importLoaders: 1,
                                sourceMap: isEnvProduction && shouldUseSourceMap,
                            }),
                            // Don't consider CSS imports dead code even if the
                            // containing package claims to have no side effects.
                            // Remove this when webpack adds a warning or an error for this.
                            // See https://github.com/webpack/webpack/issues/6571
                            sideEffects: true,
                        },
                        {
                            test: cssModuleRegex,
                            use: getStyleLoaders({
                                importLoaders: 1,
                                sourceMap: isEnvProduction && shouldUseSourceMap,
                                modules: true,
                                getLocalIdent: getCSSModuleLocalIdent,
                            }),
                        },

                        {
                            test: sassRegex,
                            exclude: sassModuleRegex,
                            use: getStyleLoaders(
                                {
                                    importLoaders: 2,
                                    sourceMap: isEnvProduction && shouldUseSourceMap,
                                },
                                'sass-loader'
                            ),
                            sideEffects: true,
                        },
                        {
                            test: sassModuleRegex,
                            use: getStyleLoaders(
                                {
                                    importLoaders: 2,
                                    sourceMap: isEnvProduction && shouldUseSourceMap,
                                    modules: true,
                                    getLocalIdent: getCSSModuleLocalIdent,
                                },
                                'sass-loader'
                            ),
                        },

                        //less配置
                        {
                            test: lessRegex,
                            exclude: lessModuleRegex,
                            use: getStyleLoaders(
                                {
                                    importLoaders: 2,
                                    sourceMap: isEnvProduction && shouldUseSourceMap,
                                },
                                'less-loader'
                            ),
                            sideEffects: true,

                        },

                        {
                            test: lessModuleRegex,
                            use: getStyleLoaders(
                                {
                                    importLoaders: 2,
                                    sourceMap: isEnvProduction && shouldUseSourceMap,
                                    modules: true,
                                    getLocalIdent: getCSSModuleLocalIdent,
                                    // modifyVars: { '@primary-color': 'red' },
                                    // javascriptEnabled: true

                                },
                                'less-loader'
                            ),


                        },


                        {
                            loader: require.resolve('file-loader'),
                            // Exclude `js` files to keep "css" loader working as it injects
                            // its runtime that would otherwise be processed through "file" loader.
                            // Also exclude `html` and `json` extensions so they get processed
                            // by webpacks internal loaders.
                            exclude: [/\.(js|mjs|jsx|ts|tsx)$/, /\.html$/, /\.json$/],
                            options: {
                                name: 'static/media/[name].[hash:8].[ext]',
                            },
                        },

                    ],
                },
            ],
        },
        plugins: [
            // Generates an `index.html` file with the <script> injected.
            new HtmlWebpackPlugin(
                Object.assign(
                    {},
                    {
                        inject: true,
                        template: paths.appHtml,
                    },
                    isEnvProduction
                        ? {
                            minify: {
                                removeComments: true,
                                collapseWhitespace: true,
                                removeRedundantAttributes: true,
                                useShortDoctype: true,
                                removeEmptyAttributes: true,
                                removeStyleLinkTypeAttributes: true,
                                keepClosingSlash: true,
                                minifyJS: true,
                                minifyCSS: true,
                                minifyURLs: true,
                            },
                        }
                        : undefined
                )
            ),
            // Inlines the webpack runtime script. This script is too small to warrant
            // a network request.
            isEnvProduction &&
            shouldInlineRuntimeChunk &&
            new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/runtime~.+[.]js/]),
            // Makes some environment variables available in index.html.
            // The public URL is available as %PUBLIC_URL% in index.html, e.g.:
            // <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
            // In production, it will be an empty string unless you specify "homepage"
            // in `package.json`, in which case it will be the pathname of that URL.
            // In development, this will be an empty string.
            new InterpolateHtmlPlugin(HtmlWebpackPlugin, env.raw),
            // This gives some necessary context to module not found errors, such as
            // the requesting resource.
            new ModuleNotFoundPlugin(paths.appPath),
            // Makes some environment variables available to the JS code, for example:
            // if (process.env.NODE_ENV === 'production') { ... }. See `./env.js`.
            // It is absolutely essential that NODE_ENV is set to production
            // during a production build.
            // Otherwise React will be compiled in the very slow development mode.
            new webpack.DefinePlugin(env.stringified),
            // This is necessary to emit hot updates (currently CSS only):
            isEnvDevelopment && new webpack.HotModuleReplacementPlugin(),
            // Watcher doesn't work well if you mistype casing in a path so we use
            // a plugin that prints an error when you attempt to do this.
            // See https://github.com/facebook/create-react-app/issues/240
            isEnvDevelopment && new CaseSensitivePathsPlugin(),
            // If you require a missing module and then `npm install` it, you still have
            // to restart the development server for Webpack to discover it. This plugin
            // makes the discovery automatic so you don't have to restart.
            // See https://github.com/facebook/create-react-app/issues/186
            isEnvDevelopment &&
            new WatchMissingNodeModulesPlugin(paths.appNodeModules),
            isEnvProduction &&
            new MiniCssExtractPlugin({
                // Options similar to the same options in webpackOptions.output
                // both options are optional
                filename: 'static/css/[name].[contenthash:8].css',
                chunkFilename: 'static/css/[name].[contenthash:8].chunk.css',
            }),
            // Generate a manifest file which contains a mapping of all asset filenames
            // to their corresponding output file so that tools can pick it up without
            // having to parse `index.html`.
            new ManifestPlugin({
                fileName: 'asset-manifest.json',
                publicPath: publicPath,
                generate: (seed, files) => {
                    const manifestFiles = files.reduce(function (manifest, file) {
                        manifest[file.name] = file.path;
                        return manifest;
                    }, seed);

                    return {
                        files: manifestFiles,
                    };
                },
            }),
            // Moment.js is an extremely popular library that bundles large locale files
            // by default due to how Webpack interprets its code. This is a practical
            // solution that requires the user to opt into importing specific locales.
            // https://github.com/jmblog/how-to-optimize-momentjs-with-webpack
            // You can remove this if you don't use Moment.js:
            new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
            // Generate a service worker script that will precache, and keep up to date,
            // the HTML & assets that are part of the Webpack build.
            isEnvProduction &&
            new WorkboxWebpackPlugin.GenerateSW({
                clientsClaim: true,
                exclude: [/\.map$/, /asset-manifest\.json$/],
                importWorkboxFrom: 'cdn',
                navigateFallback: publicUrl + '/index.html',
                navigateFallbackBlacklist: [
                    // Exclude URLs starting with /_, as they're likely an API call
                    new RegExp('^/_'),
                    // Exclude URLs containing a dot, as they're likely a resource in
                    // public/ and not a SPA route
                    new RegExp('/[^/]+\\.[^/]+$'),
                ],
            }),
            // TypeScript type checking
            useTypeScript &&
            new ForkTsCheckerWebpackPlugin({
                typescript: resolve.sync('typescript', {
                    basedir: paths.appNodeModules,
                }),
                async: isEnvDevelopment,
                useTypescriptIncrementalApi: true,
                checkSyntacticErrors: true,
                resolveModuleNameModule: process.versions.pnp
                    ? `${__dirname}/pnpTs.js`
                    : undefined,
                resolveTypeReferenceDirectiveModule: process.versions.pnp
                    ? `${__dirname}/pnpTs.js`
                    : undefined,
                tsconfig: paths.appTsConfig,
                reportFiles: [
                    '**',
                    '!**/__tests__/**',
                    '!**/?(*.)(spec|test).*',
                    '!**/src/setupProxy.*',
                    '!**/src/setupTests.*',
                ],
                watch: paths.appSrc,
                silent: true,
                // The formatter is invoked directly in WebpackDevServerUtils during development
                formatter: isEnvProduction ? typescriptFormatter : undefined,
            }),
        ].filter(Boolean),
        // Some libraries import Node modules but don't use them in the browser.
        // Tell Webpack to provide empty mocks for them so importing them works.
        node: {
            module: 'empty',
            dgram: 'empty',
            dns: 'mock',
            fs: 'empty',
            http2: 'empty',
            net: 'empty',
            tls: 'empty',
            child_process: 'empty',
        },
        // Turn off performance processing because we utilize
        // our own hints via the FileSizeReporter
        performance: false,
    };
};





//-----------------   todo kim-stamp eslint规则大全  -------------------------
// "no-restricted-globals": ["error", "event", "fdescribe"]  该规则允许您指定您不希望在应用程序中使用的全局变量名称。
// "no-alert": 0,//禁止使用alert confirm prompt
// "no-array-constructor": 2,//禁止使用数组构造器
// "no-bitwise": 0,//禁止使用按位运算符
// "no-caller": 1,//禁止使用arguments.caller或arguments.callee
// "no-catch-shadow": 2,//禁止catch子句参数与外部作用域变量同名
// "no-class-assign": 2,//禁止给类赋值
// "no-cond-assign": 2,//禁止在条件表达式中使用赋值语句
// "no-console": 2,//禁止使用console
// "no-const-assign": 2,//禁止修改const声明的变量
// "no-constant-condition": 2,//禁止在条件中使用常量表达式 if(true) if(1)
// "no-continue": 0,//禁止使用continue
// "no-control-regex": 2,//禁止在正则表达式中使用控制字符
// "no-debugger": 2,//禁止使用debugger
// "no-delete-var": 2,//不能对var声明的变量使用delete操作符
// "no-div-regex": 1,//不能使用看起来像除法的正则表达式/=foo/
// "no-dupe-keys": 2,//在创建对象字面量时不允许键重复 {a:1,a:1}
// "no-dupe-args": 2,//函数参数不能重复
// "no-duplicate-case": 2,//switch中的case标签不能重复
// "no-else-return": 2,//如果if语句里面有return,后面不能跟else语句
// "no-empty": 2,//块语句中的内容不能为空
// "no-empty-character-class": 2,//正则表达式中的[]内容不能为空
// "no-empty-label": 2,//禁止使用空label
// "no-eq-null": 2,//禁止对null使用==或!=运算符
// "no-eval": 1,//禁止使用eval
// "no-ex-assign": 2,//禁止给catch语句中的异常参数赋值
// "no-extend-native": 2,//禁止扩展native对象
// "no-extra-bind": 2,//禁止不必要的函数绑定
// "no-extra-boolean-cast": 2,//禁止不必要的bool转换
// "no-extra-parens": 2,//禁止非必要的括号
// "no-extra-semi": 2,//禁止多余的冒号
// "no-fallthrough": 1,//禁止switch穿透
// "no-floating-decimal": 2,//禁止省略浮点数中的0 .5 3.
// "no-func-assign": 2,//禁止重复的函数声明
// "no-implicit-coercion": 1,//禁止隐式转换
// "no-implied-eval": 2,//禁止使用隐式eval
// "no-inline-comments": 0,//禁止行内备注
// "no-inner-declarations": [2, "functions"],//禁止在块语句中使用声明（变量或函数）
// "no-invalid-regexp": 2,//禁止无效的正则表达式
// "no-invalid-this": 2,//禁止无效的this，只能用在构造器，类，对象字面量
// "no-irregular-whitespace": 2,//不能有不规则的空格
// "no-iterator": 2,//禁止使用__iterator__ 属性
// "no-label-var": 2,//label名不能与var声明的变量名相同
// "no-labels": 2,//禁止标签声明
// "no-lone-blocks": 2,//禁止不必要的嵌套块
// "no-lonely-if": 2,//禁止else语句内只有if语句
// "no-loop-func": 1,//禁止在循环中使用函数（如果没有引用外部变量不形成闭包就可以）
// "no-mixed-requires": [0, false],//声明时不能混用声明类型
// "no-mixed-spaces-and-tabs": [2, false],//禁止混用tab和空格
// "linebreak-style": [0, "windows"],//换行风格
// "no-multi-spaces": 1,//不能用多余的空格
// "no-multi-str": 2,//字符串不能用\换行
// "no-multiple-empty-lines": [1, {"max": 2}],//空行最多不能超过2行
// "no-native-reassign": 2,//不能重写native对象
// "no-negated-in-lhs": 2,//in 操作符的左边不能有!
// "no-nested-ternary": 0,//禁止使用嵌套的三目运算
// "no-new": 1,//禁止在使用new构造一个实例后不赋值
// "no-new-func": 1,//禁止使用new Function
// "no-new-object": 2,//禁止使用new Object()
// "no-new-require": 2,//禁止使用new require
// "no-new-wrappers": 2,//禁止使用new创建包装实例，new String new Boolean new Number
// "no-obj-calls": 2,//不能调用内置的全局对象，比如Math() JSON()
// "no-octal": 2,//禁止使用八进制数字
// "no-octal-escape": 2,//禁止使用八进制转义序列
// "no-param-reassign": 2,//禁止给参数重新赋值
// "no-path-concat": 0,//node中不能使用__dirname或__filename做路径拼接
// "no-plusplus": 0,//禁止使用++，--
// "no-process-env": 0,//禁止使用process.env
// "no-process-exit": 0,//禁止使用process.exit()
// "no-proto": 2,//禁止使用__proto__属性
// "no-redeclare": 2,//禁止重复声明变量
// "no-regex-spaces": 2,//禁止在正则表达式字面量中使用多个空格 /foo bar/
// "no-restricted-modules": 0,//如果禁用了指定模块，使用就会报错
// "no-return-assign": 1,//return 语句中不能有赋值表达式
// "no-script-url": 0,//禁止使用javascript:void(0)
// "no-self-compare": 2,//不能比较自身
// "no-sequences": 0,//禁止使用逗号运算符
// "no-shadow": 2,//外部作用域中的变量不能与它所包含的作用域中的变量或参数同名
// "no-shadow-restricted-names": 2,//严格模式中规定的限制标识符不能作为声明时的变量名使用
// "no-spaced-func": 2,//函数调用时 函数名与()之间不能有空格
// "no-sparse-arrays": 2,//禁止稀疏数组， [1,,2]
// "no-sync": 0,//nodejs 禁止同步方法
// "no-ternary": 0,//禁止使用三目运算符
// "no-trailing-spaces": 1,//一行结束后面不要有空格
// "no-this-before-super": 0,//在调用super()之前不能使用this或super
// "no-throw-literal": 2,//禁止抛出字面量错误 throw "error";
// "no-undef": 1,//不能有未定义的变量
// "no-undef-init": 2,//变量初始化时不能直接给它赋值为undefined
// "no-undefined": 2,//不能使用undefined
// "no-unexpected-multiline": 2,//避免多行表达式
// "no-underscore-dangle": 1,//标识符不能以_开头或结尾
// "no-unneeded-ternary": 2,//禁止不必要的嵌套 var isYes = answer === 1 ? true : false;
// "no-unreachable": 2,//不能有无法执行的代码
// "no-unused-expressions": 2,//禁止无用的表达式
// "no-unused-vars": [2, {"vars": "all", "args": "after-used"}],//不能有声明后未被使用的变量或参数
// "no-use-before-define": 2,//未定义前不能使用
// "no-useless-call": 2,//禁止不必要的call和apply
// "no-void": 2,//禁用void操作符
// "no-var": 0,//禁用var，用let和const代替
// "no-warning-comments": [1, { "terms": ["todo", "fixme", "xxx"], "location": "start" }],//不能有警告备注
// "no-with": 2,//禁用with

// "array-bracket-spacing": [2, "never"],//是否允许非空数组里面有多余的空格
// "arrow-parens": 0,//箭头函数用小括号括起来
// "arrow-spacing": 0,//=>的前/后括号
// "accessor-pairs": 0,//在对象中使用getter/setter
// "block-scoped-var": 0,//块语句中使用var
// "brace-style": [1, "1tbs"],//大括号风格
// "callback-return": 1,//避免多次调用回调什么的
// "camelcase": 2,//强制驼峰法命名
// "comma-dangle": [2, "never"],//对象字面量项尾不能有逗号
// "comma-spacing": 0,//逗号前后的空格
// "comma-style": [2, "last"],//逗号风格，换行时在行首还是行尾
// "complexity": [0, 11],//循环复杂度
// "computed-property-spacing": [0, "never"],//是否允许计算后的键名什么的
// "consistent-return": 0,//return 后面是否允许省略
// "consistent-this": [2, "that"],//this别名
// "constructor-super": 0,//非派生类不能调用super，派生类必须调用super
// "curly": [2, "all"],//必须使用 if(){} 中的{}
// "default-case": 2,//switch语句最后必须有default
// "dot-location": 0,//对象访问符的位置，换行的时候在行首还是行尾
// "dot-notation": [0, { "allowKeywords": true }],//避免不必要的方括号
// "eol-last": 0,//文件以单一的换行符结束
// "eqeqeq": 2,//必须使用全等
// "func-names": 0,//函数表达式必须有名字
// "func-style": [0, "declaration"],//函数风格，规定只能使用函数声明/函数表达式
// "generator-star-spacing": 0,//生成器函数*的前后空格
// "guard-for-in": 0,//for in循环要用if语句过滤
// "handle-callback-err": 0,//nodejs 处理错误
// "id-length": 0,//变量名长度
// "indent": [2, 4],//缩进风格
// "init-declarations": 0,//声明时必须赋初值
// "key-spacing": [0, { "beforeColon": false, "afterColon": true }],//对象字面量中冒号的前后空格
// "lines-around-comment": 0,//行前/行后备注
// "max-depth": [0, 4],//嵌套块深度
// "max-len": [0, 80, 4],//字符串最大长度
// "max-nested-callbacks": [0, 2],//回调嵌套深度
// "max-params": [0, 3],//函数最多只能有3个参数
// "max-statements": [0, 10],//函数内最多有几个声明
// "new-cap": 2,//函数名首行大写必须使用new方式调用，首行小写必须用不带new方式调用
// "new-parens": 2,//new时必须加小括号
// "newline-after-var": 2,//变量声明后是否需要空一行
// "object-curly-spacing": [0, "never"],//大括号内是否允许不必要的空格
// "object-shorthand": 0,//强制对象字面量缩写语法
// "one-var": 1,//连续声明
// "operator-assignment": [0, "always"],//赋值运算符 += -=什么的
// "operator-linebreak": [2, "after"],//换行时运算符在行尾还是行首
// "padded-blocks": 0,//块语句内行首行尾是否要空行
// "prefer-const": 0,//首选const
// "prefer-spread": 0,//首选展开运算
// "prefer-reflect": 0,//首选Reflect的方法
// "quotes": [1, "single"],//引号类型 `` "" ''
// "quote-props":[2, "always"],//对象字面量中的属性名是否强制双引号
// "radix": 2,//parseInt必须指定第二个参数
// "id-match": 0,//命名检测
// "require-yield": 0,//生成器函数必须有yield
// "semi": [2, "always"],//语句强制分号结尾
// "semi-spacing": [0, {"before": false, "after": true}],//分号前后空格
// "sort-vars": 0,//变量声明时排序
// "space-after-keywords": [0, "always"],//关键字后面是否要空一格
// "space-before-blocks": [0, "always"],//不以新行开始的块{前面要不要有空格
// "space-before-function-paren": [0, "always"],//函数定义时括号前面要不要有空格
// "space-in-parens": [0, "never"],//小括号里面要不要有空格
// "space-infix-ops": 0,//中缀操作符周围要不要有空格
// "space-return-throw-case": 2,//return throw case后面要不要加空格
// "space-unary-ops": [0, { "words": true, "nonwords": false }],//一元运算符的前/后要不要加空格
// "spaced-comment": 0,//注释风格要不要有空格什么的
// "strict": 2,//使用严格模式
// "use-isnan": 2,//禁止比较时使用NaN，只能用isNaN()
// "valid-jsdoc": 0,//jsdoc规则
// "valid-typeof": 2,//必须使用合法的typeof的值
// "vars-on-top": 2,//var必须放在作用域顶部
// "wrap-iife": [2, "inside"],//立即执行函数表达式的小括号风格
// "wrap-regex": 0,//正则表达式字面量用小括号包起来
// "yoda": [2, "never"]//禁止尤达条件
